import { ColumnProps, ImageProps, UserProps } from './store'

export function generateFitUrl(data: ImageProps, width: number, height: number, format = ['m_pad']) {
  if (data && data.url) {
    const formatStr = format.reduce((prev, current) => {
      return current + ',' + prev
    }, '')
    data.fitUrl = data.url + `?x-oss-process=image/resize,${formatStr},h_${height},w_${width}`
  }
}

// 处理默认图片逻辑
export function addColumnAvatar(data: ColumnProps| UserProps, width: number, height: number) {
  // 如果有头像的话就按 generateFitUrl 的方式处理
  if (data.avatar) {
    generateFitUrl(data.avatar, width, height)
  } else {
    // 没有头像的话 就按默认头像处理
    const parseCol = data as ColumnProps
    data.avatar = {
      fitUrl: require(parseCol.title ? '@/assets/column.jpg' : '@/assets/avatar.jpg')
    }
  }
}

// beforeUploadCheck 为抽象出来的检查上传文件的function
// 两个参数，第一个参数是 file ，表示上传的文件为 File 类型
// 第二个参数是 condition ，类型为一个组合类型
interface CheckCondition {
  // format 可以是多种格式，png jpg 皆可，所以是个 string数组
  format?: string[];
  // size 大小 是一个数组类型，后有单位：字节 比特
  size?: number;

}
// 规定错误类型
type ErrorType = 'size' | 'format'|null
export function beforeUploadCheck(file: File, condition: CheckCondition) {
  const { format, size } = condition
  // 首先检查是否是合法的 format
  // 如果是 format 存在且包含 file 中的 type 就通过
  const isValideFormat = format ? format.includes(file.type) : true
  // 然后检查是否是合法的 size大小
  // 如果是 小于 1MB 就合法
  const isValideSize = size ? (file.size / 1024 / 1024 < size) : true
  // 返回值不但希望告诉用户是否成功，还要在出错时告诉用户出错在哪
  // 根据不同的错误定义不同的error
  let error: ErrorType = null
  if (!isValideFormat) {
    error = 'format'
  }
  if (!isValideSize) {
    error = 'size'
  }
  // 定义返回值时定义为一个对象，分别为是否通过且错误的信息是什么
  return {
    passed: isValideFormat && isValideSize,
    error
  }
}

// 完成 state，从数组到 object 的变形
// 再从 object 变回到数组
// 创建两个函数完成这些事情
// 创建两个测试的数据来完成创建的两个函数
interface TestProps {
  _id: string;
  name: string;
}

const testData: TestProps[] = [{ _id: '1', name: 'a' }, { _id: '2', name: 'b' }]

// Indexable Types
// 通过 方括号里面加 string 来访问他 例如：testData2[1]
const testData2: {[key: string]: TestProps} = {
  1: { _id: '1', name: 'a' },
  2: { _id: '2', name: 'b' }
}

// 使用约束泛型 T extends 让 T 上至少有一个 _id 属性
export const arrToObj = <T extends {_id?: string}>(arr: Array<T>) => {
  return arr.reduce((prev, current) => {
    if (current._id) {
      prev[current._id] = current
    }
    return prev
    // 将最开始的对象断言成 key: string 类型
  }, {} as {[key: string]: T})
}
// console.log(arrToObj(testData)) // {1: {…}, 2: {…}}
// 将 testData 转换为了 testData2 格式

// 转换回来
export const objToArr = <T>(obj: {[key: string]: T}) => {
  return Object.keys(obj).map(key => obj[key])
}

// console.log(objToArr(testData2)) // [{…}, {…}]
